package es.ise.core.repositories;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.beanutils.BeanToPropertyValueTransformer;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.mybatis.generator.internal.util.JavaBeansUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import es.ise.core.mappers.BaseMapper;
import es.ise.core.model.BaseTable;

/**
 * DAO para acceder de forma genérica a cualquier modelo en la base de datos.
 * Es una capa simplificada por encima de los Mappers y Examples de MyBatis. Si
 * para una tarea específica se necesita utilizar alguna herramienta de MyBatis
 * no soportado por este DAO, se deberá crear un DAO específico para ese modelo.
 * 
 * @author Paco
 */
@Repository
public class GenericDAO
{
	// mapa que asocia modelos con el mapper necesario para su ejecución
	private Map<String, BaseMapper> mappers = new HashMap<String, BaseMapper>();
	
	@Autowired
	public void setMappers(Map<String, BaseMapper> mappers)
	{
		for(String key: mappers.keySet())
		{
			this.mappers.put(getModelName(key), mappers.get(key));
		}
		System.out.println(StringUtils.join(this.mappers.keySet(), "\n"));
	}
	
	private String getModelName(String name)
	{
		String baseName = name.replace("Mapper", "").replace("Example", "");
		return String.format("%s%s", baseName.substring(0, 1).toUpperCase(), baseName.substring(1));
	}
	
	private <E> E selectFirst(Collection<E> collection)
	{
		Iterator<E> iterator = collection.iterator();
		if(iterator.hasNext())
			return iterator.next();
		else
			return null;
	}
	
	public <T extends BaseTable> T get(Class<T> daoClass, Long id)
	{
		return null;
	}
}
